package svgbrowser;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import org.apache.batik.dom.svg.SAXSVGDocumentFactory;
import org.apache.batik.swing.JSVGCanvas;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.image.JPEGTranscoder;
import org.apache.batik.util.XMLResourceDescriptor;
import org.w3c.dom.Document;
import org.w3c.dom.svg.SVGDocument;

/**
 * Factoria para los visores de archivos SVG (imagenes vectoriales).
 * 
 * @author Jorge Berjano
 */
public class FactoriaVisorSVG {

    private String nombreFichero;
    private Document documento;
    private ByteArrayOutputStream flujoSalida;

    public FactoriaVisorSVG(String nombreFichero) {
        this.nombreFichero = nombreFichero;
    }

    /**
     * Carga el archivo xml que representa la imagen vectorial y crea el DOM.
     */
    public void preparar() {

        String parser = XMLResourceDescriptor.getXMLParserClassName();
        SAXSVGDocumentFactory factoria = new SAXSVGDocumentFactory(parser);
        try {
            documento = factoria.createDocument(new File(nombreFichero).toURI().toString());
        } catch (Exception ex) {
            documento = null;
        }
    }

    /**
     * Obtiene un componente swing que representa la imagen vectorial.
     */
    public JComponent getComponente() {

        if (documento == null) {
            preparar();
        }

        if (documento == null) {
            return null;
        }

        JSVGCanvas svgCanvas = new JSVGCanvas();
        if (documento != null && documento instanceof SVGDocument) {
            svgCanvas.setSVGDocument((SVGDocument) documento);
        }
        return svgCanvas;
    }
    
    public Image getImagen(int ancho, int alto) throws Exception {

        JPEGTranscoder transcoder = new JPEGTranscoder();

//        transcoder.addTranscodingHint(JPEGTranscoder.KEY_XML_PARSER_CLASSNAME,
//            "org.apache.crimson.parser.XMLReaderImpl");

        transcoder.addTranscodingHint(JPEGTranscoder.KEY_QUALITY, new Float(1.0));
        transcoder.addTranscodingHint(JPEGTranscoder.KEY_WIDTH, new Float(ancho));
        transcoder.addTranscodingHint(JPEGTranscoder.KEY_HEIGHT, new Float(alto));

        InputStream flujoEntrada = new FileInputStream(nombreFichero);
        TranscoderInput input = new TranscoderInput(flujoEntrada);
               
        flujoSalida = new ByteArrayOutputStream();
        //OutputStream flujoSalida = new FileOutputStream(nombreFichero + ".jpg");        
        TranscoderOutput output = new TranscoderOutput(flujoSalida);
        transcoder.transcode(input, output);
        
        ImageIcon icon = new ImageIcon(flujoSalida.toByteArray());
        
        flujoSalida.reset();
        flujoSalida.flush();
        flujoSalida.close();
        return icon.getImage();
    }
    
//        public Image getImagen(int ancho, int alto) throws Exception {
//
//        JPEGTranscoder transcoder = new JPEGTranscoder();
//
//        transcoder.addTranscodingHint(JPEGTranscoder.KEY_QUALITY, new Float(.8));
//
//        InputStream flujoEntrada = new FileInputStream(nombreFichero);
//        TranscoderInput input = new TranscoderInput(flujoEntrada);
//               
//        //ByteArrayOutputStream flujoSalida = new ByteArrayOutputStream();
//        OutputStream flujoSalida = new FileOutputStream(nombreFichero + ".jpg");        
//        TranscoderOutput output = new TranscoderOutput(flujoSalida);
//        transcoder.transcode(input, output);
//
//        //ImageIcon icon = new ImageIcon(flujoSalida.toByteArray());
//        
//        flujoSalida.flush();
//        flujoSalida.close();
//        return null;//icon.getImage();
//    }
}
